// miniprogram/pages/editor/editor.js
import classData from '../../assets/data/classes'

const app = getApp()

const FORM_DATA = {
  type: 0, // 发布类型
  publisher: '', // 您的称呼
  phone: '', // 手机号码
  title: '', // 标题
  classes: [], // 类别
  time: app.formatDate(new Date(), 'date'), // 发现时间
  region: [], // 区域
  address: '', // 地址
  image: '', // 图片
  detail_images: [], // 详情图片
  description: '', // 描述
}

Page({

  /**
   * 页面的初始数据
   */
  data: {
    formData: Object.assign({}, FORM_DATA), // 表单数据
    endTime: app.formatDate(new Date(), 'date'),// 发现时间--时间选项的最晚时间
    displayRegion: '', // 地区--显示内容
    classOptions: classData, // 类别选项
    selectedClass: [], // 选中的类别
    selectedRegion: [], // 选中的地区
    positionInfo: null, // 地理位置信息
    tipsType: '', // toptips--类型
    tipsMsg: '' // toptips--提示内容
  },

  /**
   * 提交表单数据
   */
  bindSave () {
    const { _id, publisher, phone, title, classes, region, address, image } = this.data.formData
    if (!publisher || !phone || !title || classes.length === 0 || region.length === 0 || !address || !image) {
      this.setData({
        tipsType: 'info',
        tipsMsg: '信息填写不完整'
      })
    } else {
      wx.showModal({
        content: '确定发布公告吗？',
        success: res => {
          if (res.confirm) {
            wx.showLoading({ title: '提交中' })
            wx.cloud.callFunction({
              name: 'saveNotice',
              data: this.data.formData
            }).then(res => {
              if (res.result.code === 0) {
                // 清除缓存
                wx.removeStorage({
                  key: 'editingNotice'
                })
                // 跳转页面
                if (_id) {
                  wx.reLaunch({ url: `/pages/detail/detail?id=${_id}` })
                } else {
                  wx.reLaunch({ url: '/pages/person/person?tab=0' })
                }
              } else {
                this.setData({
                  tipsType: 'error',
                  tipsMsg: '操作失败'
                })
              }
            }).catch(err => {
              this.setData({
                tipsType: 'error',
                tipsMsg: '操作失败'
              })
            }).finally(() => {
              wx.hideLoading()
            })
          }
        }
      })
    }
  },

  /**
   * 清除表单数据--发布场景
   */
  bindClear () {
    wx.showModal({
      content: '数据将不可恢复，确定清除吗？',
      success: res => {
        if (res.confirm) {
          // 删除云端图片
          const {image, detail_images} = this.data.formData
          const fileList = []
          if (image && image.startsWith('cloud://')) {
            fileList.push(image)
          }
          if (Array.isArray(detail_images)) {
            detail_images.forEach(url => {
              if (url.startsWith('cloud://')) {
                fileList.push(url)
              }
            })
          }
          if (fileList.length > 0) {
            wx.cloud.deleteFile({ fileList })
          }
          // 清除缓存
          wx.removeStorage({ key: 'editingNotice' })
          // 重置表单数据
          this.setData({ formData: Object.assign({}, FORM_DATA) })
        }
      }
    })
  },

  /**
   * 取消操作--编辑场景
   */
  bindCancel () {
    wx.navigateBack()
  },

  /**
   * 缓存表单数据
   */
  cacheData () {
    if (!this.data.formData._id) {
      wx.setStorage({
        key: 'editingNotice',
        data: this.data.formData
      })
    }
  },

  /**
   * 输入框--更新字段值
   * @param {Event} e 
   */
  bindChangeValue (e) {
    const key = e.currentTarget.dataset.key
    const value = e.detail.value
    if (key === 'type') {
      this.setData({ [`formData.${key}`]: value })
    } else {
      this.data.formData[key] = value
    }
  },

  /**
   * 选择时间
   * @param {Event} e 
   */
  bindTimeChange (e) {
    const value = e.detail.value
    this.setData({ 'formData.time': value })
    this.cacheData()
  },

  /**
   * 选择类别
   * @param {Event} event 
   */
  bindClassChange (event) {
    const indexes = event.detail.value
    const options = this.data.classOptions
    const class1 = options[0][indexes[0]]
    const class2 = options[1][indexes[1]]
    this.setData({
      'formData.classes': [class1, class2]
    })
    this.cacheData()
  },

  /**
   * 切换一级类别
   * @param {Event} event 
   */
  bindClassColumnChange (event) {
    const { column, value } = event.detail
    if (column === 0) {
      this.setData({
        'classOptions[1]': classData[value].children
      })
    }
  },

  /**
   * 选择区域
   * @param {Event} event 
   */
  bindRegionChange (event) {
    this.setData({
      'formData.region': event.detail.value
    })
    this.cacheData()
  },

  /**
   * 获取用户手机号码
   * @param {Event} event 
   */
  getUserPhone () {
    app.getUserPhone()
      .then(res => {
        this.setData({ 'formData.phone': res })
        FORM_DATA.phone = res
      })
  },

  /**
   * 初始化类别选项
   * @param {Array} classes 类别信息 
   */
  initClassOptions (classes) {
    if (!classes || classes.length === 0) {
      this.setData({ classOptions: [
        classData.map(v => v.label),
        classData[0].children
      ]})
    } else {
      const classObj = classData.find(v => v.label === classes[0])
      this.setData({ classOptions: [
        classData.map(v => v.label),
        classObj ? classObj.children : []
      ]})
    }
  },

  /**
   * 更新图片路径
   * @param {Event} event
   */
  bindChangeImage (event) {
    const value = event.detail.value
    this.setData({ 'formData.image': value })
    this.cacheData()
  },

  /**
   * 更新详情图片列表
   * @param {Event} event
   */
  bindChangeDetailImages (event) {
    const value = event.detail.value
    this.data.formData.detail_images = value
    this.cacheData()
  },

  /**
   * 获取位置信息
   */
  async getPositionInfo () {
    const result = await app.getPositionInfo()
    if (result.code === 0) {
      this.setData({
        positionInfo: result,
        'formData.position': result.position,
        'formData.region': result.region,
        'formData.address': result.address
      })
    } else {
      this.setData({
        tipsType: 'error',
        tipsMsg: result.msg
      })
    }
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: async function (options) {
    const id = options.id
    const _this = this

    // 编辑场景--详情页传来的公告数据
    const eventChannel = this.getOpenerEventChannel()
    eventChannel.on('editNotice', res => {
      wx.setNavigationBarTitle({ title: '编辑公告' })
      _this.setData({ formData: Object.assign({}, res.data) })
      _this.initClassOptions()
    })

    // 发布场景--获取缓存数据
    if (!id) {
      wx.setNavigationBarTitle({ title: '发布公告' })
      wx.getStorage({
        key: 'editingNotice',
        success (res) {
          const notice = res.data
          if (notice) {
            const formData = _this.data.formData
            _this.setData({ formData: Object.assign(formData, notice) })
          }
          // 用户已验证过的手机号码
          if (!notice.phone) {
            _this.getUserPhone()
          }
          // 类别选项
          _this.initClassOptions(notice.classes)
        }, fail (err) {
          // 用户已验证过的手机号码
          _this.getUserPhone()
          // 类别选项
          _this.initClassOptions()
        }
      })
    }
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    // 获取位置信息
    const { _id, region } = this.data.formData
    if (!_id && (!region || region.length === 0)) {
      this.getPositionInfo()
    }
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
    
  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
    
  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})